﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AutoMapper;

namespace OcenyOpisowe.Core.ModelMappers
{
	/// <summary>
	/// Abstrakcyjny mapper dla obiektów.
	/// Udostępnia funkcjonalności wspólne dla wszystkich mapperów projektu Ocen Opisowych.
	/// </summary>
	public abstract class AbstractModelMapper : IModelMapper
	{
		#region Implementation of IMapper
		/// <summary>
		/// Mapuje obiekt źródłowy posiadający podany źródłowy typ na wyjściowy typ.
		/// </summary>
		/// <typeparam name="T1">Typ wejściowego obiektu, którego zamapować na wyjściowy typ.</typeparam>
		/// <typeparam name="T2">Wyjściowy typ obiektu.</typeparam>
		/// <param name="source">Źródłowy obiekt do zamapowania.</param>
		/// <returns>Zamapowany obiekt.</returns>
		public virtual T2 Map<T1, T2>(T1 source)
		{
			return (T2)Map(source, typeof(T1), typeof(T2));
		}

		/// <summary>
		/// Mapuje obiekt źródłowy posiadający podany źródłowy typ na wyjściowy typ.
		/// </summary>
		/// <param name="source">Źródłowy obiekt do zamapowania.</param>
		/// <param name="sourceType">Typ wejściowego obiektu, którego zamapować na wyjściowy typ.</param>
		/// <param name="destinationType">Wyjściowy typ obiektu.</param>
		/// <returns>Zamapowany obiekt.</returns>
		public virtual object Map(object source, Type sourceType, Type destinationType)
		{
			return Mapper.Map(source, sourceType, destinationType);
		}
		#endregion
	}
}
